#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
股票投资分析主程序
整合选股、基本面分析、概率分析和报告生成
"""

import pandas as pd
from datetime import datetime
import time
from typing import List, Dict

# 导入自定义模块
try:
    from stock_screener_baostock import StockScreener
    from probability_analyzer import ProbabilityAnalyzer
    from fundamental_analyzer import FundamentalAnalyzer
    from analysis_report_generator import AnalysisReportGenerator
except ImportError as e:
    print(f"[错误] 模块导入失败: {e}")
    print("请确保所有必需的模块都在同一目录下")
    sys.exit(1)


class StockAnalysisSystem:
    """股票投资分析系统"""
    
    def __init__(self, use_screener: bool = True):
        """
        初始化分析系统
        
        Args:
            use_screener: 是否使用选股系统筛选股票，False则手动指定股票列表
        """
        self.use_screener = use_screener
        self.prob_analyzer = ProbabilityAnalyzer()
        self.fund_analyzer = FundamentalAnalyzer()
        self.report_generator = AnalysisReportGenerator()
        
        print("="*80)
        print(" 股票投资分析系统 ".center(80, "="))
        print("="*80)
        print(f"启动时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print(f"分析模式: {'自动选股' if use_screener else '手动指定'}")
        print("="*80 + "\n")
    
    def run(self, stock_list: List[Dict] = None, top_n: int = 5):
        """
        执行完整分析流程
        
        Args:
            stock_list: 手动指定的股票列表 [{'代码': '600519', '名称': '贵州茅台'}, ...]
            top_n: 保留Top N的股票到最终报告
        
        Returns:
            报告文件路径
        """
        # 第一步：获取股票列表
        if self.use_screener:
            stocks = self._run_screener()
        else:
            if not stock_list:
                print("[错误] 手动模式需要提供股票列表")
                return None
            stocks = stock_list
        
        if not stocks:
            print("[错误] 未获取到股票列表")
            return None
        
        print(f"\n[*] 待分析股票数量: {len(stocks)}")
        
        # 第二步：逐个分析
        analysis_results = []
        
        print("\n" + "="*80)
        print(" 开始逐个股票分析 ".center(80, "="))
        print("="*80 + "\n")
        
        for idx, stock in enumerate(stocks, 1):
            code = stock['代码']
            name = stock['名称']
            
            print(f"\n[{idx}/{len(stocks)}] 分析 {code} {name}")
            print("-" * 80)
            
            try:
                # 概率分析
                prob_result = self.prob_analyzer.analyze_stock(code, name)
                
                if prob_result is None:
                    print(f"  ✗ {code} {name} 概率分析失败，跳过")
                    continue
                
                # 基本面分析
                fund_result = self.fund_analyzer.analyze_stock(code, name)
                
                # 合并结果
                analysis_results.append({
                    'probability': prob_result,
                    'fundamental': fund_result
                })
                
                print(f"  ✓ {code} {name} 分析完成")
                
                # 避免请求过快
                time.sleep(0.5)
                
            except Exception as e:
                print(f"  ✗ {code} {name} 分析出错: {e}")
                continue
        
        if not analysis_results:
            print("\n[错误] 没有成功分析的股票")
            return None
        
        print("\n" + "="*80)
        print(f" 分析完成: 成功 {len(analysis_results)}/{len(stocks)} ".center(80, "="))
        print("="*80)
        
        # 第三步：生成报告
        print("\n[*] 生成投资分析报告...")
        self.report_generator.print_summary(analysis_results)
        report_path = self.report_generator.generate_full_report(analysis_results, top_n=top_n)
        
        return report_path
    
    def _run_screener(self) -> List[Dict]:
        """运行选股系统"""
        print("\n[*] 启动选股系统...\n")
        
        try:
            screener = StockScreener()
            result_df = screener.run()
            
            if result_df.empty:
                print("[警告] 选股系统未找到符合条件的股票")
                return []
            
            # 转换为列表格式
            stocks = []
            for _, row in result_df.iterrows():
                stocks.append({
                    '代码': row['代码'],
                    '名称': row['名称']
                })
            
            return stocks
            
        except Exception as e:
            print(f"[错误] 选股系统运行失败: {e}")
            return []


def main():
    """主函数"""
    print("\n请选择运行模式：")
    print("1. 自动选股模式（使用 stock_screener_baostock.py 筛选20只股票）")
    print("2. 手动指定模式（分析指定的股票列表）")
    
    try:
        choice = input("\n请输入选择 (1 或 2): ").strip()
    except:
        choice = "1"
    
    if choice == "2":
        # 手动模式
        print("\n[*] 手动指定模式")
        print("请输入股票代码和名称（格式：代码,名称），每行一个，输入空行结束：")
        print("示例：600519,贵州茅台")
        
        stock_list = []
        while True:
            try:
                line = input().strip()
                if not line:
                    break
                
                parts = line.split(',')
                if len(parts) >= 2:
                    stock_list.append({
                        '代码': parts[0].strip(),
                        '名称': parts[1].strip()
                    })
                else:
                    print(f"  [警告] 格式错误，跳过: {line}")
            except:
                break
        
        if not stock_list:
            print("[错误] 未输入任何股票，退出")
            return
        
        system = StockAnalysisSystem(use_screener=False)
        report_path = system.run(stock_list=stock_list, top_n=5)
        
    else:
        # 自动选股模式
        print("\n[*] 自动选股模式")
        system = StockAnalysisSystem(use_screener=True)
        report_path = system.run(top_n=5)
    
    if report_path:
        print("\n" + "="*80)
        print(" 分析任务完成 ".center(80, "="))
        print("="*80)
        print(f"\n✓ 报告已保存: {report_path}")
        print(f"✓ 请查看报告以获取详细的投资分析和建议")
        print("\n" + "="*80 + "\n")
    else:
        print("\n[错误] 报告生成失败\n")


def quick_analyze(stock_codes: List[str]):
    """
    快速分析指定股票（供脚本调用）
    
    Args:
        stock_codes: 股票代码列表，如 ['600519', '600036']
    """
    # 简单获取股票名称（实际应该查询）
    stock_list = [{'代码': code, '名称': f'股票{code}'} for code in stock_codes]
    
    system = StockAnalysisSystem(use_screener=False)
    return system.run(stock_list=stock_list, top_n=len(stock_list))


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n[*] 用户中断，退出程序")
    except Exception as e:
        print(f"\n[错误] 程序异常: {e}")
        import traceback
        traceback.print_exc()
